1 - Introduction

什么是styled components呢?它是一种CSS-IN-JS样式解决方案。虽然有很多种解决方案,但是这一种方案被很多公司使用。

image-20251105095314407

使用这个库的好处:

image-20251105095552936

就是可以这样写组件的样式:

image-20251105100220362

这个库来设置样式,我用起来感觉不是很好,不是很直接。但是我在mui里面看到过这种用法,mui对此应该做了增强,没想到是这个库的作用。反正都了解一下吧,这个课程也只是入门课程。

image-20251105111200755

2 - Installation and Setup

创建项目:npm create vite@latest styled-components-demo

vscode安装插件:

image-20251105095833298

安装依赖:npm i styled-componens

3 - Basic Styled Component

这节课为一个简单的button设置样式。我们可以直接在button上面设置style属性,也可以设置className属性,但是这里我们使用styled component的方式来做。

效果:

image-20251105101808073

可以看到,以组件的方式来定义样式,使用这个组件就有了样式。

但是我们创建一个自定义组件,需要的不仅仅是样式,还需要定义很多属性,这该怎么办呢?之后会讲到。

现在来看怎么将组件抽离出来。

创建下面的文件:

image-20251105102506712

然后引入使用:

效果是正常的。

4 - Using Props

如果在使用styled components的时候,我们传入样式相关的属性(比如说variant),那么styled应该怎么处理这些属性props呢?

因为在定义styled组件的时候,我们使用了模板字符串,所以在里面可以使用插值interpolation,里面可以接收到props,并且可以写函数。

在使用时,传入variant属性:

效果:

image-20251105104033883

5 - Extending Styles

扩展样式。

有时候我们想利用已有组件的样式,来稍微扩展一下,就成了我们想要的样式,这该怎么做呢?

可以给styled函数传递一个参数,参数是一个已有的组件,那么新的组件就会继承这个参数组件的样式,并且可以写样式进行扩展:

所以在Button.styles.ts里面,定义一个新的组件FancyButton:

导出新的组件:

使用新的组件:

效果:

image-20251105105727764

styled components提供的一个特性,可以通过设置as属性,将组件变为多态组件。

可以看到,真实渲染的标签变为了a标签。

image-20251105110238954

6 - Pseudo classes

pseudo:伪。这节课学习伪类。

使用&:hover{}的方法来定义伪类。

按照这种方法,还可以添加多种伪类,比如说:

7 - Passed Props and Adding Attributes

styled components会传递html元素上的任何属性。比如说:

查看真实DOM,可以看到type属性已经传递了:

image-20251105124306511

styled components支持定义元素的属性,避免在使用的时候,一直要传递属性。

可以看到,这个button上面加上了type属性:

image-20251105125103491

同时,.attrs()方法里面还可以接收props参数,让里面的属性(比如说type)的值根据props参数来决定。

8 - Animations

可以使用styled components提供的keyframes方法,来创建动画效果。

9 - Theming

这个库也提供主题定义功能,使用它的ThemeProvider

那么我们就可以使用提供的主题来创建组件:

使用这个组件:

效果:

10 - Global Styles

这节课学习怎么创建全局样式,一般来说,全局样式写在一个单独的css文件里面,然后在App.tsx里面引入。但这里我们学习使用styled提供的createGlobalStyle方法来创建全局样式。

可以看到,变为了Roboto字体。

image-20251105132731574

 

因为全局样式是以组件的形式注册的,所以全局样式组件里面也可以接收到theme上下文,所以可以这样写:

可以看到,变为了Segoe UI字体。

image-20251105133948839